import BaseObject from "../../移动商城改/base/baseObject.js";
import ShopCartListModel from "../model/shopCartListModel.js";
import OrderController from "./orderController.js";


/**
 * @description 购物车列表控制器
 * @class {ShopCartListController}
 * @author hhx
 * @date 2024-11-28 08:11
 * @version 0.1.2
 */
export default class ShopCartListController extends BaseObject {

    /**
     * @description 视图对象
     * @private
     * @type {HTMLElement}
     */
    _view = null;

    /**
     * @description 模型对象
     * @private
     * @type {ProductListModel}
     */
    _model = null;

    /**
     * @description 事件生产者
     * @private
     * @type {EventProduct}
     */
    _controllerEventProducer = null;

    /**
     * @description 构建订单控制器
     * @private
     * @type {OrderController} 订单控制器
     */
    _orderController = null;

    /**
     * @description 商品列表控制器构造函数
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 商品列表控制器
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ShopCartListController|*} 商品列表控制器
     */
    static instance(props = {}) {
        let instance = new ShopCartListController(props);
        instance.init(props);
        return instance;
    }


    //=========================== 成员属性 ===============================

    /**
     * @description 获取 基础视图
     * @member
     * @protected
     * @returns {HTMLElement|*} 基础显示模型
     */
    get view() {
        return this._view;
    }

    /**
     * @description 设置 基础视图
     * @member
     * @protected
     * @param value {HTMLElement|*} 基础显示模型
     */
    set view(value) {
        this._view = value;
    }

    /**
     * @description 获取 商品列表模型
     * @member
     * @protected
     * @returns {ProductListModel|*} 商品列表模型
     */
    get model() {
        return this._model;
    }

    /**
     * @description 设置 商品列表模型
     * @member
     * @protected
     * @param value {ProductListModel|*} 商品列表模型
     */
    set model(value) {
        this._model = value;
    }

    /**
     * @description 获取 生产者对象
     * @member
     * @protected
     * @returns {EventProduct|*} 生产者对象
     */
    get controllerEventProducer() {
        return this._controllerEventProducer;
    }

    /**
     * @description 设置 生产者对象
     * @member
     * @protected
     * @param value {ProductListModel|*} 生产者对象
     */
    set controllerEventProducer(value) {
        this._controllerEventProducer = value;
    }


    /**
     * @description 获取 订单控制器
     * @member
     * @protected
     * @return {orderController|*} 订单控制器
     */
    get orderController() {
        return this._orderController;
    }

    /**
     * @description 设置 订单控制器
     * @member
     * @protected
     * @param value {orderController|*} 订单控制器
     */
    set orderController(value) {
        this._orderController = value;
    }

    //=========================== 属性方法 ===============================

    /**
     * @description 获取 基本视图
     * @public
     * @returns {HTMLElement} 基本视图
     */
    getView() {
        return this.view;
    }

    /**
     * @description 设置 基本视图模型
     * @public
     * @param value {HTMLElement} 基本视图模型
     */
    setView(value) {
        this.view = value;
    }

    /**
     * @description 获取 商品列表模型
     * @public
     * @returns {ProductListModel} 商品列表模型
     */
    getModel() {
        return this.model;
    }

    /**
     * @description 设置 商品列表模型
     * @public
     * @param model {ShopCartListModel} 商品列表模型
     */
    setModel(model) {
        this.model = model;
    }

    /**
     * @description 获取 控制器生产者
     * @public
     * @returns {EventProduct} 控制器生产者
     */
    getControllerEventProducer() {
        return this.controllerEventProducer;
    }

    /**
     * @description 设置 控制器生产者
     * @public
     * @param value {EventProduct} 控制器生产者
     */
    setControllerEventProducer(value) {
        this.controllerEventProducer = value;
    }

    /**
     * @description 获取 订单控制器
     * @public
     * @return {OrderController} 订单控制器
     */
    getOrderController() {
        return this.orderController;
    }

    /**
     * @description 设置 订单控制器
     * @public
     * @param value {OrderController} 订单控制器
     */
    setOrderController(value) {
        this.orderController = value;
    }

    //=========================== 构建方法 ===============================


    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {
        super.init(props);

        //初始化视图
        this.initView();

        //初始化模型
        this.initModel();

        //初始化事件订阅
        this.initEventSubscriber();

        //初始化子控制器
        this.initOrderController()

    }


    //=========================== 内部方法 ===============================

    /**
     * @description 初始化视图
     * @protected
     */
    initView() {
        let view = this.createView();
        this.setView(view);
    }

    /**
     * @description 初始化模型
     * @protected
     */
    initModel() {
        let model = this.createModel();
        this.setModel(model)
    }

    /**
     * @description 初始化事件订阅
     * @protected
     */
    initEventSubscriber() {
        this.subscriberAddCartProduct()
    }

    /**
     * @description 初始化订单控制器
     * @protected
     */
    initOrderController() {
        let orderController = OrderController.instance();
        this.setOrderController(orderController)
    }


    //=========================== 创建方法 ===============================

    /**
     * @description 创建视图
     * @protected
     * @return {HTMLElement} 视图
     */
    createView() {
        return document.createElement("div");
    }

    /**
     * @description 创建模型
     * @protected
     * @return {ShopCartListModel} 购物车模型
     */
    createModel() {
        return ShopCartListModel.instance();
    }


    //=========================== 事件订阅 ===============================

    /**
     * @description 添加商品事件
     * @protected
     */
    subscriberAddCartProduct() {
        this.model.subscriberAddCartProduct(this.handleAddCartProduct.bind(this));
    }

    //=========================== 事件触发 ===============================


    //=========================== 处理方法 ===============================

    /**
     * @description 添加商品回调
     * @protected
     * @param param {*} 参数
     */
    handleAddCartProduct(param) {
        console.log('添加商品到购物车成功', '购物车视图渲染', param);
    }

    //=========================== 接口方法 ===============================

    /**
     * @description 添加商品到购物车
     * @public
     * @param product {ProductModel} 商品
     */
    addProduct(product) {
        this.model.addProduct(this, product);
    }

    /**
     * @description 创建订单
     * @public
     */
    createOrder() {

        //获取购物车列表
        let shopCartList = this.model.getShopCartList();

        //获取购物车总价
        let totalPrice = this.model.getTotalPrice();

        //创建订单
        this.orderController.createOrder({shopCartList, totalPrice});
    }
}

